home *** CD-ROM | disk | FTP | other *** search
- page ,132
- ;----------------------------Module-Header------------------------------;
- ; Module Name: STRETCH32.ASM
- ;
- ; StretchBLT for DIBs
- ;
- ; NOTES:
- ; - Does not handle mirroring in x or y.
- ; - Does not handle pixel translation
- ; - will not work "in place"
- ;
- ; - This is the 32 bit version (32 bit code seg that is...)
- ;
- ; AUTHOR: ToddLa (Todd Laney) Microsoft
- ;
- ;-----------------------------------------------------------------------;
- ?PLM=1
- ?WIN=0
- .xlist
- include cmacro32.inc
- ; include cmacros.inc
- include windows.inc
- .list
-
- sBegin Data
- sEnd Data
-
- ifndef SEGNAME
- SEGNAME equ <_TEXT32>
- endif
-
- createSeg %SEGNAME, CodeSeg, word, public, CODE
-
- sBegin CodeSeg
- .386
- assumes cs,CodeSeg
- assumes ds,nothing
- assumes es,nothing
-
- ;--------------------------------------------------------------------------;
- ;
- ; DDA type constants returned from stretch_init_dda
- ;
- ;--------------------------------------------------------------------------;
-
- STRETCH_1to1 equ (0*4) ; dst = src
- STRETCH_1to2 equ (1*4) ; dst = src * 2
- STRETCH_1to4 equ (2*4) ; dst = src * 4
- STRETCH_1toN equ (3*4) ; dst > src
- STRETCH_2to1 equ (4*4) ; dst = src / 2
- STRETCH_4to1 equ (5*4) ; dst = src / 4
- STRETCH_Nto1 equ (6*4) ; dst < src
- STRETCH_VOID equ (7*4) ; not used.
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_functions
- ;
- ; functions for stretching a single scanline, this table is indexed
- ; by the x dda type (see above) and the bit depth
- ;
- ;--------------------------------------------------------------------------;
-
- x_stretch_functions label dword ;function table for x_stretch
-
- x_stretch_8_functions label dword ;function table for x_stretch
- dd x_stretch_1to1 ; STRETCH_1to1
- dd x_stretch_8_1to2 ; STRETCH_1to2
- dd x_stretch_8_1to4 ; STRETCH_1to4
- dd x_stretch_8_1toN ; STRETCH_1toN
- dd x_stretch_8_Nto1 ; STRETCH_2to1
- dd x_stretch_8_Nto1 ; STRETCH_4to1
- dd x_stretch_8_Nto1 ; STRETCH_Nto1
- dd 0
-
- x_stretch_16_functions label dword ;function table for x_stretch
- dd x_stretch_1to1 ; STRETCH_1to1
- dd x_stretch_16_1to2 ; STRETCH_1to2
- dd x_stretch_16_1toN ; STRETCH_1to4
- dd x_stretch_16_1toN ; STRETCH_1toN
- dd x_stretch_16_Nto1 ; STRETCH_2to1
- dd x_stretch_16_Nto1 ; STRETCH_4to1
- dd x_stretch_16_Nto1 ; STRETCH_Nto1
- dd 0
-
- x_stretch_24_functions label dword ;function table for x_stretch
- dd x_stretch_1to1 ; STRETCH_1to1
- dd x_stretch_24_1toN ; STRETCH_1to2
- dd x_stretch_24_1toN ; STRETCH_1to4
- dd x_stretch_24_1toN ; STRETCH_1toN
- dd x_stretch_24_Nto1 ; STRETCH_2to1
- dd x_stretch_24_Nto1 ; STRETCH_4to1
- dd x_stretch_24_Nto1 ; STRETCH_Nto1
- dd 0
-
- x_stretch_32_functions label dword ;function table for x_stretch
- dd x_stretch_1to1 ; STRETCH_1to1
- dd x_stretch_32_1to2 ; STRETCH_1to2
- dd x_stretch_32_1toN ; STRETCH_1to4
- dd x_stretch_32_1toN ; STRETCH_1toN
- dd x_stretch_32_Nto1 ; STRETCH_2to1
- dd x_stretch_32_Nto1 ; STRETCH_4to1
- dd x_stretch_32_Nto1 ; STRETCH_Nto1
- dd 0
-
- ;--------------------------------------------------------------------------;
- ;
- ; y_stretch_functions
- ;
- ; functions for stretching in the y direction, indexed by the y dda type
- ;
- ;--------------------------------------------------------------------------;
-
- y_stretch_functions label dword ;function table for y_stretch
- dd y_stretch_1toN ; STRETCH_1to1
- dd y_stretch_1toN ; STRETCH_1to2
- dd y_stretch_1toN ; STRETCH_1to4
- dd y_stretch_1toN ; STRETCH_1toN
- dd y_stretch_Nto1 ; STRETCH_2to1
- dd y_stretch_Nto1 ; STRETCH_4to1
- dd y_stretch_Nto1 ; STRETCH_Nto1
-
- ;--------------------------------------------------------------------------;
- ;
- ; stretch_functions
- ;
- ; special case stretching routines, used if (y dda type) = (x dda type)
- ; (and entry exists in this table)
- ;
- ; these functions stretch the entire image.
- ;
- ;--------------------------------------------------------------------------;
-
- stretch_functions label dword
-
- stretch_8_functions label dword
- dd 0 ; STRETCH_1to1
- dd stretch_8_1to2 ; STRETCH_1to2
- dd 0 ; STRETCH_1to4
- dd 0 ; STRETCH_1toN
- dd 0 ; STRETCH_2to1
- dd 0 ; STRETCH_4to1
- dd 0 ; STRETCH_Nto1
- dd 0
-
- stretch_16_functions label dword
- dd 0 ; STRETCH_1to1
- dd stretch_16_1to2 ; STRETCH_1to2
- dd 0 ; STRETCH_1to4
- dd 0 ; STRETCH_1toN
- dd 0 ; STRETCH_2to1
- dd 0 ; STRETCH_4to1
- dd 0 ; STRETCH_Nto1
- dd 0
-
- stretch_24_functions label dword
- dd 0 ; STRETCH_1to1
- dd 0 ; STRETCH_1to2
- dd 0 ; STRETCH_1to4
- dd 0 ; STRETCH_1toN
- dd 0 ; STRETCH_2to1
- dd 0 ; STRETCH_4to1
- dd 0 ; STRETCH_Nto1
- dd 0
-
- stretch_32_functions label dword
- dd 0 ; STRETCH_1to1
- dd 0 ; STRETCH_1to2
- dd 0 ; STRETCH_1to4
- dd 0 ; STRETCH_1toN
- dd 0 ; STRETCH_2to1
- dd 0 ; STRETCH_4to1
- dd 0 ; STRETCH_Nto1
- dd 0
-
- ;--------------------------------------------------------------------------;
- ;
- ; StretchDIB()
- ;
- ; Entry:
- ; Stack based parameters as described below.
- ;
- ; Returns:
- ; none
- ;
- ; Registers Preserved:
- ; DS,ES,ESI,EDI,EBP
- ;
- ;--------------------------------------------------------------------------;
- assumes ds,nothing
- assumes es,nothing
-
- cProc StretchDIB,<FAR,PUBLIC,PASCAL>,<>
- parmD biDst ;--> BITMAPINFO of dest
- parmD lpDst ;--> to destination bits
- parmW DstX ;Destination origin - x coordinate
- parmW DstY ;Destination origin - y coordinate
- parmW DstXE ;x extent of the BLT
- parmW DstYE ;y extent of the BLT
- parmD biSrc ;--> BITMAPINFO of source
- parmD lpSrc ;--> to source bits
- parmW SrcX ;Source origin - x coordinate
- parmW SrcY ;Source origin - y coordinate
- parmW SrcXE ;x extent of the BLT
- parmW SrcYE ;y extent of the BLT
-
- localD x_stretch ;X stretch function
- localD y_stretch ;Y stretch function
-
- localD x_stretch_dda ;X stretch DDA
- localD x_stretch_dda_fract ;X stretch DDA fract
-
- localD y_stretch_dda ;Y stretch DDA
- localD y_stretch_dda_fract ;Y stretch DDA fract
-
- localD ScanCount ;number of scans left to do
- localD Yerr ;Y dda error
-
- localD SrcWidth ;width of source dib in bytes
- localD DstWidth ;width of dest in bytes
-
- localD SrcBytes ;width of source blt in bytes
- localD DstBytes ;width of dest blt in bytes
-
- localD SrcInc
- localD DstInc
-
- localD lDstXE ;x extent of the BLT
- localD lDstYE ;y extent of the BLT
- localD lSrcXE ;x extent of the BLT
- localD lSrcYE ;y extent of the BLT
- cBegin
- cld
-
- push esi
- push edi
- push ds
-
- call stretch_init ; init all the frame variables
- jc short StretchDIBExit
-
- call y_stretch ; do it!
-
- StretchDIBExit:
- pop ds
- pop edi
- pop esi
- cEnd
-
- ;--------------------------------------------------------------------------;
- ;
- ; stretch_init_dda
- ;
- ; initialize the parameters of a DDA from ax to dx.
- ;
- ; Entry:
- ; eax - source coord
- ; edx - dest coord
- ; Returns:
- ; eax - STRETCH_1to1
- ; STRETCH_1to2
- ; STRETCH_1to4
- ; STRETCH_1toN
- ; STRETCH_2to1
- ; STRETCH_4to1
- ; STRETCH_Nto1
- ;
- ; edx - src / dst
- ; ebx - src / dst fraction
- ;
- ;--------------------------------------------------------------------------;
-
- stretch_init_dda proc near
-
- cmp eax,edx
- je short stretch_init_dda_1to1
- ja short stretch_init_dda_Nto1
- errn$ stretch_init_dda_1toN
-
- stretch_init_dda_1toN:
- mov ebx,eax
- add ebx,ebx
- cmp ebx,edx
- je short stretch_init_dda_1to2
- add ebx,ebx
- cmp ebx,edx
- je short stretch_init_dda_1to4
-
- mov ebx,edx ; ebx = dest
- mov edx,eax ; edx = src
- xor eax,eax ; edx:eax = src<<32
- div ebx ; eax = (src<<32)/dst
-
- mov ebx,eax
- xor edx,edx
- mov eax,STRETCH_1toN
- ret
-
- stretch_init_dda_Nto1:
- mov ebx,edx
- add ebx,ebx
- cmp eax,ebx
- je short stretch_init_dda_2to1
- add ebx,ebx
- cmp eax,ebx
- je short stretch_init_dda_4to1
-
- mov ebx,edx ; ebx = dst
- xor edx,edx ; edx:eax = src
- mov eax,eax
- div ebx ; eax = src/dst edx = rem
- push eax
- xor eax,eax ; edx:eax = rem<<32
- div ebx ; eax = rem<<32/dst
- mov ebx,eax
- pop edx
- mov eax,STRETCH_Nto1
- ret
-
- stretch_init_dda_1to1:
- mov edx, 1
- xor ebx, ebx
- mov eax, STRETCH_1to1
- ret
-
- stretch_init_dda_1to2:
- xor edx, edx
- mov ebx, 80000000h
- mov eax, STRETCH_1to2
- ret
-
- stretch_init_dda_1to4:
- xor edx, edx
- mov ebx, 40000000h
- mov eax, STRETCH_1to4
- ret
-
- stretch_init_dda_2to1:
- mov edx, 2
- xor ebx, ebx
- mov eax, STRETCH_2to1
- ret
-
- stretch_init_dda_4to1:
- mov edx, 4
- xor ebx, ebx
- mov eax, STRETCH_4to1
- ret
-
- stretch_init_dda endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; stretch_init
- ;
- ; init local frame vars for StretchDIB
- ;
- ; ENTRY:
- ; ss:bp --> stretchdib frame
- ;
- ;--------------------------------------------------------------------------;
-
- stretch_init_error:
- stc
- ret
-
- stretch_init proc near
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ; expand word params to dwords
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- movzx eax,DstXE
- movzx ebx,DstYE
- movzx ecx,SrcXE
- movzx edx,SrcYE
-
- mov lDstXE,eax
- mov lDstYE,ebx
- mov lSrcXE,ecx
- mov lSrcYE,edx
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ; Make sure they didn't give us an extent of zero anywhere
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- or eax,eax
- jz short stretch_init_error
-
- or ebx,ebx
- jz short stretch_init_error
-
- or ecx,ecx
- jz short stretch_init_error
-
- or edx,edx
- jz short stretch_init_error
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ; make sure the bit depth of the source and dest match and are valid
- ; we only handle 8,16,24 bit depths.
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- xor edi,edi ; be sure the high words are clear.
- xor esi,esi
- xor ecx,ecx
-
- lds si, biSrc
- les di, biDst
-
- mov cx, [esi].biBitCount ; get the bit depth
- cmp cx, es:[edi].biBitCount ; make sure they are the same.
- jne short stretch_init_error
-
- cmp ecx,8
- je short stretch_init_bit_depth_ok
-
- cmp ecx,16
- je short stretch_init_bit_depth_ok
-
- cmp ecx,24
- je short stretch_init_bit_depth_ok
-
- cmp ecx,32
- jne short stretch_init_error
- errn$ stretch_init_bit_depth_ok
-
- stretch_init_bit_depth_ok:
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ;
- ; Set up the initial source pointer
- ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- mov eax,[esi].biWidth
- mul ecx
- add eax,31
- and eax,not 31
- shr eax,3
- mov SrcWidth,eax
- mov SrcInc,eax
-
- lds si,lpSrc
-
- movzx edx,SrcY
- mul edx
- add esi,eax
-
- movzx eax,SrcX
- mul ecx
- shr eax,3
- add esi,eax
-
- mov eax,lSrcXE
- mul ecx
- shr eax,3
- mov SrcBytes,eax
- sub SrcInc,eax
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ;
- ; Set up the initial dest pointer
- ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- mov eax,es:[edi].biWidth
- mul ecx
- add eax,31
- and eax,not 31
- shr eax,3
- mov DstWidth,eax
- mov DstInc,eax
-
- cmp es:[edi].biHeight,0 ; init a upside down DIB
- jge short @f
- movsx ebx,DstY
- add ebx,es:[edi].biHeight
- not ebx
- mov DstY,bx
- neg DstWidth
- neg DstInc
- @@:
- les di,lpDst
-
- movsx edx,DstY
- mul edx
- add edi,eax
-
- movsx eax,DstX
- mul ecx
- shr eax,3
- add edi,eax
-
- mov eax,lDstXE
- mul ecx
- shr eax,3
- mov DstBytes,eax
- sub DstInc,eax
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ;
- ; conver the bit depth (in cx) to a table index
- ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- sub ecx,8 ; cx = 0,8,16,24
- shl ecx,2 ; cx = (0,1,2,3) * 32
-
- errnz <stretch_16_functions - stretch_8_functions - 32>
- errnz <stretch_24_functions - stretch_16_functions - 32>
- errnz <stretch_32_functions - stretch_24_functions - 32>
-
- errnz <x_stretch_16_functions - x_stretch_8_functions - 32>
- errnz <x_stretch_24_functions - x_stretch_16_functions - 32>
- errnz <x_stretch_32_functions - x_stretch_24_functions - 32>
-
- errnz <STRETCH_1to2 - STRETCH_1to1 - 4>
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ;
- ; Setup y_stretch function pointer
- ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- mov eax,lSrcYE
- mov edx,lDstYE
- call stretch_init_dda
- mov y_stretch_dda,edx
- mov y_stretch_dda_fract,ebx
-
- mov ebx,eax
- mov edx,y_stretch_functions[ebx]
- mov y_stretch,edx
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ;
- ; Setup x_stretch function pointer
- ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- push eax ; Save Y stretch type
- mov eax,lSrcXE
- mov edx,lDstXE
-
- call stretch_init_dda
- mov x_stretch_dda,edx
- mov x_stretch_dda_fract,ebx
-
- mov ebx,eax ; get x stretch
- or ebx,ecx ; or in bit depth
- mov edx,x_stretch_functions[ebx]
- mov x_stretch,edx
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ;
- ; check for a special case stretch routine
- ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- pop edx ; get y stretch back
- cmp eax,edx ; is x stretch == to y stretch?
- jne short stretch_init_exit
-
- or ebx,ecx
- mov edx,stretch_functions[ebx]
- or edx,edx
- jz short stretch_init_exit
-
- mov y_stretch,edx ; we have special case routine.
- errn$ stretch_init_exit
-
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
- ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;
-
- stretch_init_exit:
- clc
- ret
-
- stretch_init endp
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;--------------------------------------------------------------------------;
- ;
- ; y_stretch_1toN
- ;
- ; do the entire stretch, y stretching (DstYE > SrcYE)
- ;
- ; Entry:
- ; ds:esi --> (SrcX, SrcY) in source
- ; es:edi --> (DstX, DstY) in destination
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; none. (stretch is done.)
- ;--------------------------------------------------------------------------;
- y_stretch_1toN proc near
- mov ecx,lDstYE
- mov ScanCount,ecx
-
- mov edx,lDstYE ; dda error
- dec edx
- mov Yerr,edx
-
- y_stretch_1toN_loop:
- push esi
- push edi
- call x_stretch
- pop edi
- pop esi
-
- add edi, DstWidth ; next dest scan.
-
- mov eax,lSrcYE
- sub Yerr,eax
- jnc short y_stretch_1toN_next
-
- mov eax,lDstYE
- add Yerr,eax
-
- add esi, SrcWidth ; next source scan.
-
- y_stretch_1toN_next:
- dec ScanCount
- jnz short y_stretch_1toN_loop
-
- ret
-
- y_stretch_1toN endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; y_stretch_Nto1
- ;
- ; do the entire stretch, y shrinking (DstYE < SrcYE)
- ;
- ; Entry:
- ; ds:esi --> (SrcX, SrcY) in source
- ; es:edi --> (DstX, DstY) in destination
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; none. (stretch is done.)
- ;--------------------------------------------------------------------------;
- y_stretch_Nto1 proc near
- mov ecx,lDstYE
- mov ScanCount,ecx
-
- mov edx,lSrcYE ; dda error
- dec edx
- mov Yerr,edx
-
- y_stretch_Nto1_loop:
- push esi
- push edi
- call x_stretch
- pop edi
- pop esi
-
- add edi, DstWidth ; next dest scan.
-
- mov eax, lDstYE
- @@: add esi, SrcWidth ; next source scan.
- sub Yerr, eax
- jnc short @b
-
- mov eax,lSrcYE
- add Yerr,eax
-
- y_stretch_Nto1_next:
- dec ScanCount
- jnz short y_stretch_Nto1_loop
-
- ret
-
- y_stretch_Nto1 endp
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_1to1
- ;
- ; handle a stretch of a scanline (DstXE == SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_1to1 proc near
-
- mov ecx,DstBytes ; number of bytes to copy
- mov ebx,ecx
-
- shr ecx,2 ; get count in DWORDs
- rep movs dword ptr es:[edi], dword ptr ds:[esi]
- mov ecx,ebx
- and ecx,3
- rep movs byte ptr es:[edi], byte ptr ds:[esi]
- ret
-
- x_stretch_1to1 endp
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8 BIT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_8_1toN
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_8_1toN proc near
-
- mov ebx,x_stretch_dda_fract
- xor edx,edx
- mov ecx,lDstXE ; # bytes to store
- shr ecx,2 ; unroll by 4
- jz short x_stretch_8_1toN_next
- align 4
- x_stretch_8_1toN_loop:
- rept 2
- mov al,byte ptr ds:[esi]
- add edx,ebx
- adc esi,0
- mov ah,byte ptr ds:[esi]
- add edx,ebx
- adc esi,0
- ror eax,16
- endm
- mov dword ptr es:[edi],eax
- add edi,4
- dec ecx
- jnz short x_stretch_8_1toN_loop
-
- x_stretch_8_1toN_next:
- mov ecx,lDstXE
- and ecx,3
- jnz short x_stretch_8_1toN_odd
- ret
-
- x_stretch_8_1toN_odd:
- mov al,byte ptr ds:[esi]
- mov byte ptr es:[edi],al
- add edx,ebx
- adc esi,0
- inc edi
- dec ecx
- jnz short x_stretch_8_1toN_odd
- ret
-
- x_stretch_8_1toN endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_8_1to2
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_8_1to2 proc near
- mov ecx,lSrcXE ; loop cout
- mov ebx,ecx
- shr ecx,1
- jz short x_stretch_8_1to2_next
- align 4
- x_stretch_8_1to2_loop:
- mov ax, word ptr ds:[esi] ; get 2 pixels
- add esi,2
-
- mov edx,eax
- mov al,ah
- shl eax,16
- mov al,dl
- mov ah,dl
- mov dword ptr es:[edi], eax ; store 4
- add edi,4
- dec ecx
- jnz short x_stretch_8_1to2_loop
-
- x_stretch_8_1to2_next:
- test ebx,1
- jnz short x_stretch_8_1to2_done
- ret
-
- x_stretch_8_1to2_done:
- mov al,byte ptr ds:[esi]
- mov ah,al
- mov word ptr es:[edi],ax
- inc esi
- add edi,2
- ret
-
- x_stretch_8_1to2 endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_8_1to4
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_8_1to4 proc near
- mov ecx,lSrcXE ; loop cout
- mov ebx,ecx
- shr ecx,1
- jz short x_stretch_8_1to4_next
- align 4
- x_stretch_8_1to4_loop:
- ; lods word ptr ds:[esi] ; get 2 pixels
- mov ax,word ptr ds:[esi] ; get 2 pixels
- add esi,2
-
- mov edx,eax
- mov ah,al
- shl eax,16
- mov al,dl
- mov ah,dl
- ; stos dword ptr es:[edi] ; store 4
- mov dword ptr es:[edi],eax
- add edi,4
-
- mov ax,dx
- mov al,ah
- shl eax,16
- mov ax,dx
- mov al,ah
- ; stos dword ptr es:[edi] ; store 4
- mov dword ptr es:[edi],eax ; store 4
- add edi,4
-
- dec ecx
- jnz short x_stretch_8_1to4_loop
-
- x_stretch_8_1to4_next:
- test ebx,1
- jnz short x_stretch_8_1to4_done
- ret
-
- x_stretch_8_1to4_done:
- mov al,byte ptr ds:[esi]
- mov ah,al
- mov dx,ax
- shl eax,16
- mov ax,dx
- mov dword ptr es:[edi],eax
- inc esi
- add edi,4
- ret
-
- x_stretch_8_1to4 endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_8_Nto1
- ;
- ; handle a shrink of a scanline (DstXE < SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ecx - destination pixels to write
- ; edx - source pixels to copy
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_8_Nto1 proc near
- mov ebx,x_stretch_dda_fract
- xor edx,edx
-
- mov ecx,lDstXE ; # bytes to store
- shr ecx,2
- jz short x_stretch_8_Nto1_cleanup
-
- push ebp
- mov ebp,x_stretch_dda
- align 4
- x_stretch_8_Nto1_loop:
- rept 4
- mov al,byte ptr ds:[esi]
- ror eax,8
- add edx,ebx
- adc esi,ebp
- endm
- mov dword ptr es:[edi],eax
- add edi,4
- dec ecx
- jnz short x_stretch_8_Nto1_loop
- pop ebp
-
- x_stretch_8_Nto1_cleanup:
- mov ecx,lDstXE
- and ecx,011b
- jnz short x_stretch_8_Nto1_loop2
- ret
-
- x_stretch_8_Nto1_loop2:
- mov al,byte ptr ds:[esi]
- mov byte ptr es:[edi],al
- inc edi
- add edx,ebx
- adc esi,x_stretch_dda
- dec ecx
- jnz short x_stretch_8_Nto1_loop2
- ret
-
- x_stretch_8_Nto1 endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; stretch_8_1to2
- ;
- ; handle a x2 stretch of a entire image
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- stretch_8_1to2 proc near
- mov eax, DstWidth
- add DstInc, eax
-
- mov ecx, lSrcXE
- mov ebx, DstWidth
- align 4
- stretch_8_1to2_outer_loop:
- mov ecx,lSrcXE ; loop cout (/4)
- shr ecx,2
- jz short stretch_8_1to2_next
- align 4
- stretch_8_1to2_loop:
- mov edx, dword ptr ds:[esi] ; get 4 pixels
- mov al,dh
- mov ah,dh
- shl eax,16
- mov al,dl
- mov ah,dl
- mov dword ptr es:[edi], eax ; store 4
- mov dword ptr es:[edi+ebx], eax ; store 4
-
- shr edx,16
-
- mov al,dh
- mov ah,dh
- shl eax,16
- mov al,dl
- mov ah,dl
- mov dword ptr es:[edi+4], eax ; store 4
- mov dword ptr es:[edi+4+ebx], eax ; store 4
-
- add edi,8
- add esi,4
-
- dec ecx
- jnz short stretch_8_1to2_loop
-
- stretch_8_1to2_next:
- mov ecx,lSrcXE
- and ecx,3
- jnz short stretch_8_1to2_odd
-
- stretch_8_1to2_even:
- add edi, DstInc
- add esi, SrcInc
-
- dec lSrcYE
- jnz short stretch_8_1to2_outer_loop
- ret
-
- stretch_8_1to2_odd:
- mov al,byte ptr ds:[esi]
- mov ah,al
- mov word ptr es:[edi],ax
- mov word ptr es:[edi+ebx],ax
- inc esi
- add edi,2
- dec ecx
- jnz short stretch_8_1to2_odd
- jz short stretch_8_1to2_even
-
- stretch_8_1to2 endp
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16 BIT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_16_1toN
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_16_1toN proc near
- xor edx,edx
-
- mov ecx,lDstXE
- shr ecx,1
- jz short x_stretch_16_1toN_cleanup
-
- align 4
- x_stretch_16_1toN_loop:
- rept 2
- mov ax,word ptr ds:[esi]
- ror eax,16
-
- add edx, x_stretch_dda_fract
- sbb ebx, ebx ; ebx = CF ? -1 : 0
- and ebx, 2
- add esi, ebx
- endm
- mov dword ptr es:[edi],eax
- add edi,4
-
- dec ecx
- jnz short x_stretch_16_1toN_loop
-
- x_stretch_16_1toN_cleanup:
- test byte ptr DstXE, 1
- jnz short x_stretch_16_1toN_odd
- ret
-
- x_stretch_16_1toN_odd:
- mov ax,word ptr ds:[esi]
- mov word ptr es:[edi],ax
- add esi,2
- add edi,2
- ret
-
- x_stretch_16_1toN endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_16_1to2
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_16_1to2 proc near
- mov ecx,lSrcXE ; loop cout
- mov ebx,ecx
- shr ecx,1
- jz short x_stretch_16_1to2_done
- align 4
- x_stretch_16_1to2_loop:
- mov eax, dword ptr ds:[esi] ; get 2 pixels
- add esi,4
-
- mov edx,eax
- shl eax,16
- mov ax,dx
- mov dword ptr es:[edi], eax ; store 2
- add edi,4
-
- mov eax,edx
- shr edx,16
- mov ax,dx
- mov dword ptr es:[edi], eax ; store 2
- add edi,4
-
- dec ecx
- jnz short x_stretch_16_1to2_loop
-
- x_stretch_16_1to2_done:
- test ebx,1
- jnz short x_stretch_16_1to2_odd
- ret
-
- x_stretch_16_1to2_odd:
- mov bx,word ptr ds:[esi]
- mov eax,ebx
- shl eax,16
- mov ax,bx
- mov dword ptr es:[edi],eax
- add esi,2
- add edi,4
- ret
-
- x_stretch_16_1to2 endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_16_Nto1
- ;
- ; handle a shrink of a scanline (DstXE < SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ecx - destination pixels to write
- ; edx - source pixels to copy
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_16_Nto1 proc near
- mov ecx,lDstXE ; # loop count
- mov ebx,x_stretch_dda_fract
- xor edx,edx
-
- push ebp
- mov ebp,x_stretch_dda
- dec ebp
- add ebp,ebp
- align 4
- x_stretch_16_Nto1_loop:
- movs word ptr es:[edi], word ptr ds:[esi]
- add esi,ebp
- add edx,ebx
- sbb eax,eax
- and eax,2
- add esi,eax
-
- dec ecx
- jnz short x_stretch_16_Nto1_loop
- pop ebp
-
- x_stretch_16_Nto1_exit:
- ret
-
- x_stretch_16_Nto1 endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; stretch_16_1to2
- ;
- ; handle a x2 stretch of a entire image
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- stretch_16_1to2 proc near
- mov ebx, DstWidth
- add DstInc, ebx
- align 4
- stretch_16_1to2_outer_loop:
- mov ecx,lSrcXE ; loop cout (/2)
- shr ecx,1
- jz short stretch_16_1to2_next
- align 4
- stretch_16_1to2_loop:
- mov edx, dword ptr ds:[esi] ; get 2 pixels
-
- mov ax,dx
- shl eax,16
- mov ax,dx
- mov dword ptr es:[edi], eax ; store 2
- mov dword ptr es:[edi+ebx], eax ; store 2
-
- shr edx,16
-
- mov ax,dx
- shl eax,16
- mov ax,dx
- mov dword ptr es:[edi+4], eax ; store 2
- mov dword ptr es:[edi+4+ebx], eax ; store 2
-
- add edi,8
- add esi,4
-
- dec ecx
- jnz short stretch_16_1to2_loop
-
- stretch_16_1to2_next:
- test lSrcXE,1
- jnz short stretch_16_1to2_odd
-
- stretch_16_1to2_even:
- add edi, DstInc
- add esi, SrcInc
-
- dec SrcYE
- jnz short stretch_16_1to2_outer_loop
- ret
-
- stretch_16_1to2_odd:
- mov dx,word ptr ds:[esi]
- mov ax,dx
- shl eax,16
- mov ax,dx
- mov dword ptr es:[edi],eax
- mov dword ptr es:[edi+ebx],eax
- add esi,2
- add edi,4
- jmp short stretch_16_1to2_even
-
- stretch_16_1to2 endp
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;24 BIT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_24_1toN
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_24_1toN proc near
-
- mov ecx,lDstXE ; # loop count
- mov ebx,x_stretch_dda_fract
- xor edx,edx
- align 4
- x_stretch_24_1toN_loop:
- movs word ptr es:[edi], word ptr ds:[esi]
- movs byte ptr es:[edi], byte ptr ds:[esi]
- add edx,ebx
- sbb eax,eax
- not eax
- and eax,-3
- add esi,eax
-
- dec ecx
- jnz short x_stretch_24_1toN_loop
-
- x_stretch_24_1toN_exit:
- ret
-
- x_stretch_24_1toN endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_24_Nto1
- ;
- ; handle a shrink of a scanline (DstXE < SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ecx - destination pixels to write
- ; edx - source pixels to copy
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_24_Nto1 proc near
- mov ecx,lDstXE ; # loop count
- mov ebx,x_stretch_dda_fract
- xor edx,edx
-
- push ebp
- mov ebp,x_stretch_dda
- dec ebp
- mov eax,ebp
- add ebp,ebp
- add ebp,eax
- align 4
- x_stretch_24_Nto1_loop:
- movs word ptr es:[edi], word ptr ds:[esi]
- movs byte ptr es:[edi], byte ptr ds:[esi]
- add esi,ebp
- add edx,ebx
- sbb eax,eax
- and eax,3
- add esi,eax
-
- dec ecx
- jnz short x_stretch_24_Nto1_loop
- pop ebp
-
- x_stretch_24_Nto1_exit:
- ret
-
- x_stretch_24_Nto1 endp
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32 BIT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_32_1toN
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_32_1toN proc near
- xor edx,edx
-
- mov ecx,lDstXE
- align 4
- x_stretch_32_1toN_loop:
- mov eax,word ptr ds:[esi]
- add edx, x_stretch_dda_fract
- sbb ebx, ebx ; ebx = CF ? -1 : 0
- and ebx, 4
- add esi, ebx
- mov dword ptr es:[edi],eax
- add edi,4
-
- dec ecx
- jnz short x_stretch_32_1toN_loop
-
- ret
-
- x_stretch_32_1toN endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_32_1to2
- ;
- ; handle a stretch of a scanline (DstXE > SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_32_1to2 proc near
- mov ecx,lSrcXE ; loop cout
- align 4
- x_stretch_32_1to2_loop:
- mov eax, dword ptr ds:[esi] ; get a pel
- mov dword ptr es:[edi], eax ; store it
- add esi,4
- mov dword ptr es:[edi+4], eax ; store it again
- add edi,8
-
- dec ecx
- jnz short x_stretch_32_1to2_loop
-
- x_stretch_32_1to2_done:
- ret
-
- x_stretch_32_1to2 endp
-
- ;--------------------------------------------------------------------------;
- ;
- ; x_stretch_32_Nto1
- ;
- ; handle a shrink of a scanline (DstXE < SrcXE)
- ;
- ; Entry:
- ; ds:esi --> begining of scan
- ; es:edi --> destination scan
- ; ecx - destination pixels to write
- ; edx - source pixels to copy
- ; ss:bp --> stack frame of StretchDIB
- ; Returns:
- ; ds:esi --> at end of scan
- ; es:edi --> at end of scan
- ;
- ;--------------------------------------------------------------------------;
- align 4
- x_stretch_32_Nto1 proc near
- mov ecx,lDstXE ; # loop count
- mov ebx,x_stretch_dda_fract
- xor edx,edx
-
- push ebp
- mov ebp,x_stretch_dda
- dec ebp
- add ebp,ebp
- add ebp,ebp
- align 4
- x_stretch_32_Nto1_loop:
- movs dword ptr es:[edi], dword ptr ds:[esi]
- add esi,ebp
- add edx,ebx
- sbb eax,eax
- and eax,4
- add esi,eax
-
- dec ecx
- jnz short x_stretch_32_Nto1_loop
- pop ebp
-
- x_stretch_32_Nto1_exit:
- ret
-
- x_stretch_32_Nto1 endp
-
- sEnd CodeSeg
-
- end
-